package io.github.echarts.render;

import io.github.echarts.model.coordinate.DataRange;
import io.github.echarts.model.geometry.Rectangle;

import java.util.HashMap;
import java.util.Map;

/**
 * 渲染上下文，存储整个渲染过程中共享的数据
 * 此类从model包移至render包，符合职责分离原则
 */
public class RenderContext {
    // 图表整体尺寸
    private int width;
    private int height;
    
    // 实际绘图区域
    private Rectangle chartArea;
    
    // 组件布局信息
    private Map<String, Rectangle> componentAreas;
    
    // 坐标系信息
    private Map<String, CoordinateSystemInfo> coordinateSystems;
    
    /**
     * 创建渲染上下文
     * 
     * @param width 图表宽度
     * @param height 图表高度
     */
    public RenderContext(int width, int height) {
        this.width = width;
        this.height = height;
        this.chartArea = new Rectangle(0, 0, width, height);
        this.componentAreas = new HashMap<>();
        this.coordinateSystems = new HashMap<>();
    }
    
    /**
     * 获取图表宽度
     * 
     * @return 宽度值
     */
    public int getWidth() {
        return width;
    }
    
    /**
     * 获取图表高度
     * 
     * @return 高度值
     */
    public int getHeight() {
        return height;
    }
    
    /**
     * 获取实际绘图区域
     * 
     * @return 绘图区域矩形
     */
    public Rectangle getChartArea() {
        return chartArea;
    }
    
    /**
     * 设置实际绘图区域
     * 
     * @param chartArea 绘图区域矩形
     */
    public void setChartArea(Rectangle chartArea) {
        this.chartArea = chartArea;
    }
    
    /**
     * 注册组件区域
     * 
     * @param componentId 组件ID
     * @param area 组件区域
     */
    public void registerComponentArea(String componentId, Rectangle area) {
        componentAreas.put(componentId, area);
    }
    
    /**
     * 获取组件区域
     * 
     * @param componentId 组件ID
     * @return 组件区域矩形，如果不存在则返回null
     */
    public Rectangle getComponentArea(String componentId) {
        return componentAreas.get(componentId);
    }
    
    /**
     * 注册坐标系信息
     * 
     * @param id 坐标系ID
     * @param info 坐标系信息
     */
    public void registerCoordinateSystem(String id, CoordinateSystemInfo info) {
        coordinateSystems.put(id, info);
    }
    
    /**
     * 获取坐标系信息
     * 
     * @param id 坐标系ID
     * @return 坐标系信息，如果不存在则返回null
     */
    public CoordinateSystemInfo getCoordinateSystemInfo(String id) {
        return coordinateSystems.get(id);
    }
    
    /**
     * 获取坐标系信息，如果不存在则返回带有默认区域的信息
     * 
     * @param id 坐标系ID
     * @param defaultWidth 默认宽度（如果需要创建默认区域）
     * @param defaultHeight 默认高度（如果需要创建默认区域）
     * @return 坐标系信息，保证不为null
     */
    public CoordinateSystemInfo getCoordinateSystemInfoSafe(String id, int defaultWidth, int defaultHeight) {
        if (id == null) {
            return createDefaultCoordinateSystemInfo(defaultWidth, defaultHeight);
        }
        
        CoordinateSystemInfo info = coordinateSystems.get(id);
        if (info == null) {
            return createDefaultCoordinateSystemInfo(defaultWidth, defaultHeight);
        }
        return info;
    }
    
    /**
     * 创建默认的坐标系信息
     * 
     * @param width 图表宽度
     * @param height 图表高度
     * @return 默认坐标系信息
     */
    private CoordinateSystemInfo createDefaultCoordinateSystemInfo(int width, int height) {
        // 创建默认布局区域（留出边距）
        Rectangle defaultArea = new Rectangle(50, 50, width - 100, height - 100);
        return new CoordinateSystemInfo(defaultArea);
    }
    
    /**
     * 存储坐标系相关的渲染信息
     */
    public static class CoordinateSystemInfo {
        private Rectangle area;
        private DataRange dataRange;
        private Map<String, Object> attributes; // 存储坐标系特有信息
        
        /**
         * 创建坐标系信息
         * 
         * @param area 坐标系区域
         */
        public CoordinateSystemInfo(Rectangle area) {
            this.area = area;
            this.attributes = new HashMap<>();
        }
        
        /**
         * 获取坐标系区域
         * 
         * @return 区域矩形
         */
        public Rectangle getArea() {
            return area;
        }
        
        /**
         * 设置坐标系区域
         * 
         * @param area 区域矩形
         */
        public void setArea(Rectangle area) {
            this.area = area;
        }
        
        /**
         * 获取数据范围
         * 
         * @return 数据范围
         */
        public DataRange getDataRange() {
            return dataRange;
        }
        
        /**
         * 设置数据范围
         * 
         * @param dataRange 数据范围
         */
        public void setDataRange(DataRange dataRange) {
            this.dataRange = dataRange;
        }
        
        /**
         * 设置属性
         * 
         * @param key 属性键
         * @param value 属性值
         */
        public void setAttribute(String key, Object value) {
            attributes.put(key, value);
        }
        
        /**
         * 获取属性
         * 
         * @param key 属性键
         * @return 属性值
         */
        public Object getAttribute(String key) {
            return attributes.get(key);
        }
    }
} 